﻿#define _CRT_SECURE_NO_WARNINGS


//设计你的循环队列实现。 循环队列是一种线性数据结构，其操作表现基于 FIFO（先进先出）
//原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。
//
//循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里，
//一旦一个队列满了，我们就不能插入下一个元素，即使在队列前面仍有空间。但是使用循环队列，我们能使用这些空间去存储新的值。
//
//你的实现应该支持如下操作：
//
//MyCircularQueue(k) : 构造器，设置队列长度为 k 。
//Front : 从队首获取元素。如果队列为空，返回 - 1 。
//Rear : 获取队尾元素。如果队列为空，返回 - 1 。
//enQueue(value) : 向循环队列插入一个元素。如果成功插入则返回真。
//deQueue() : 从循环队列中删除一个元素。如果成功删除则返回真。
//isEmpty() : 检查循环队列是否为空。
//isFull() : 检查循环队列是否已满。
//MyCircularQueue circularQueue = new MyCircularQueue(3); // 设置长度为 3
//circularQueue.enQueue(1);  // 返回 true
//circularQueue.enQueue(2);  // 返回 true
//circularQueue.enQueue(3);  // 返回 true
//circularQueue.enQueue(4);  // 返回 false，队列已满
//circularQueue.Rear();  // 返回 3
//circularQueue.isFull();  // 返回 true
//circularQueue.deQueue();  // 返回 true
//circularQueue.enQueue(4);  // 返回 true
//circularQueue.Rear();  // 返回 4



//typedef struct {
//    int* a;
//    int front;
//    int rear;
//    int k;
//} MyCircularQueue;
//
//
//
//MyCircularQueue* myCircularQueueCreate(int k) {
//    MyCircularQueue* obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));
//    obj->a = (int*)malloc(sizeof(int) * (k + 1));
//    obj->front = obj->rear = 0;
//    obj->k = k;
//    return obj;
//}
//
//bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
//    if (obj->rear == obj->front)
//        return true;
//    else
//        return false;
//}
//
//bool myCircularQueueIsFull(MyCircularQueue* obj) {
//    if ((obj->rear + 1) % (obj->k + 1) == obj->front)
//        return true;
//    else
//        return false;
//}
//
//bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
//    if (myCircularQueueIsFull(obj))
//        return false;
//    obj->a[obj->rear++] = value;
//    obj->rear %= (obj->k + 1);
//    return true;
//}
//
//bool myCircularQueueDeQueue(MyCircularQueue* obj) {
//    if (myCircularQueueIsEmpty(obj))
//        return false;
//    obj->front++;
//    obj->front %= (obj->k + 1);
//    return true;
//}
//
//int myCircularQueueFront(MyCircularQueue* obj) {
//    if (myCircularQueueIsEmpty(obj))
//        return -1;
//    return obj->a[obj->front];
//}
//
//int myCircularQueueRear(MyCircularQueue* obj) {
//    if (myCircularQueueIsEmpty(obj))
//        return -1;
//    return obj->a[(obj->rear - 1 + obj->k + 1) % (obj->k + 1)];
//}
//
//
//
//void myCircularQueueFree(MyCircularQueue* obj) {
//    free(obj->a);
//    free(obj);
//}

//
//给定一个长度为n的数组 nums ，请你找到峰值并返回其索引。数组可能包含多个峰值，在这种情况下，返回任
//何一个所在位置即可。
//1.峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于
//2.假设 nums[-1] = nums[n] = 负无穷小
//3.对于所有有效的 i 都有 nums[i] != nums[i + 1]
//
//示例：
//输入：[2, 4, 1, 2, 7, 8, 4]
//返回值：1
//说明：4和8都是峰值元素，返回4的索引1或者8的索引5都可以
//输入：[5, 3, 4, 2, 6]
//返回值：0
//说明： - 1作为下标或者n下标位置都表示负无穷小， 则0号下标5是峰值，或者4号下标6也是峰值




int findPeakElement(int* nums, int numsLen) {
    // write code here
    /*
    int i = 0;
    for(i=0;i<numsLen-1;i++)
    {
        if(i == 0)
        {
            if(nums[i] > nums[i+1])
                return i;
        }
        else
        {
            if(nums[i-1] < nums[i] && nums[i] > nums[i+1])
                return i;
        }
    }
    return i;*/
    int left = 0;
    int right = numsLen - 1;
    while (left < right)
    {
        int mid = ((right - left) >> 1) + left;
        if (nums[mid] < nums[mid + 1])
        {
            left = mid + 1;
        }
        else
        {
            right = mid;
        }
    }
    return left;

}